<?php

/**
 * Класс Php -- полезные функции, которых нет в PHP.
 * 
 * @package RL
 * @author Lucky <lucky@jetstyle.ru> 
 * @version $Id: functions.php 62 2007-09-05 08:27:21Z lucky $
 */
class Php
{

	//!a function
	/**
	 * get_attribute вернуть атрибут из некоторой структуры.
	 *
	 * @param mixed $thing нечто структурное
	 * @param string $name имя или путь атрибута в структуре 
	 * @static
	 * @access public
	 * @return mixed
	 */
	static public function get_attribute ($thing, $name)
	{
		return self::get_attribute_($thing, explode('.', $name));
	} // end of function get_attribute

	//!a function
	/**
	 * get_attribute_ вернуть атрибут из некоторой структуры.
	 *
	 * @param mixed $thing нечто структурное
	 * @param array $path путь атрибута (список сегментов)
	 * @static
	 * @access public
	 * @return mixed
	 */
	static public function get_attribute_ ($thing, $path_segments)
	{
		$res = $thing;
		while (!empty($path_segments)) {
			if (empty($path_segments)) break;
			$attr_name = array_shift($path_segments);
			if (is_array($thing) || $thing instanceof ArrayObject) {
				// это массив
				if (array_key_exists($attr_name, $thing)) {
					$res = $thing[$attr_name];
				} else {
					$res = NULL;
					break;
				}
			} elseif (is_object($thing)) {
				// это объект
				$getter = 'get'.$attr_name;
				if (method_exists($thing, $getter)) {
					$res = $thing->$getter();
				} elseif (property_exists($thing, $attr_name)) {
					$res = $thing->$attr_name;
				} else {
					$res = NULL;
					break;
				}
			} else {
				// других структур не знаем
				$res = NULL;
				break;
			}
			$thing = $res;
		}
		return $res;
	} // end of function get_attribute

}

